<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 
    ！注意写上题目题数
    例如 ：
    一、选择题
        1. B
        2. C
        3. ture false ture
        4. D
        5. C

    二、填空题
    1.
        (1)
        获取节点方法：
        getElementById
        getElementByTagName
        getElementByClassName
        getElementByName
        querySelector
        querySelectorAll
        (2)
        创建节点方法：
        createElement
        createTextNode
        (3)
        添加节点方法：
        appendChild
        append
        inserBefore(newElement,Element)
        (4)
        查找子节点：
        children
        firstElementChildren
        lastElementChildren
        childNodes
        firstChild
        lastChild
        (5)
        查找父节点：
        parentNodes
        parentElement
        (6)
        查找兄弟节点：
        previousElementSibling
        nextElementSibling
        previuosSibling
        nextSibling
        (7)
        删除节点：
        remove  删除自身
        removeChild 删除子节点
        (8)
        替换节点：
        replaceChild(newNode,oldNode)
        (9)
        克隆节点：
        cloneNode(boolean)

        2.
        (1) Object.prototype
        (2) Function.prototype
        (3) Object.prototype
        (4) Array.prototype
        (5) Object.prototype
        (6) Function.prototype
        (7) Function.prototype
        (8) Function.prototype
        (9) 
        (10) Object.prototype

        三、描述题
        1.ajax是一种用于创建快速动态网页的技术，ajax通过在后台与服服务器进行少量数据交换，使网页实现异步更新。这意味着可以在不重载这个页面的情况下，对网页的某些部分进行更新。

        2.this有__proto__属性，指向一个Object，this的原型有hasOwnproperty、isPrototypeOf、toString等属性

        3. 所有的代码从上往下依次读取，遇到同步代码时，进入执行栈调用，操作完成就出栈。遇到异步代码时，进入任务队列，分为微任务和宏任务，当同步任务出栈完后，微任务依次进入执行栈调用，微任务执行完毕出栈后，宏任务依次进入执行栈调用。由于主线程不断的重复获得任务、执行任务、再获取任务、在执行...，这种机制被称为事件循环（event loop）

        4.
        (1) 每个函数都有一个prototype属性，它默认指向一个Object空对象，原型对象中有一个constructor，它指向函数对象，作用：可以给实例化对象共享属性或者方法
        (2) 原型链：访问一个对象时，现在自身属性中查找，找到返回。如果没有，再沿着__proto__这条链向上查找。找到返回，如果最终没找到，返回undefined。

        四、逻辑题
        1.Goodbye Jack
        2.10
        3.21
        4.667
        5.Hy Jack
        6.
        7.1 报错 2

        五、实操题
        1.
                function Person(name, age) {
            this.name = name;
            this.age = age;
        };
        Person.prototype = {
            constructor: Person,
            sing() {
                console.log(this.name + "正在唱歌");
            },
            type: "高质量"
        }
        let p = new Person("lcw", 18);

        2.
                  function ajax(_url, _data, _method) {
            let data = _data || null;
            let method = _method || "GET";
            return new Promise((resolve, reject) => {
                let xhr = new XMLHttpRequest;
                if (_method.toUpperCase() === "GET") {
                    let str = "?";
                    for (let k in data) {
                        str += `${k}=${data[k]}&`;
                    };
                    xhr.open(method, _url + str.slice(0, -1));
                } else {
                    xhr.open(method, _url);
                };
                xhr.setRequestHeader("Content-type", "application/json");
                xhr.send(JSON.stringify(data));
                xhr.addEventListener("readystatechange", () => {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        resolve(JSON.parse(xhr.responseText));
                    } else {
                        reject(JSON.parse(xhr.responseText));
                    };
                });
            });
        };

        3.
        let arr = [1, 2, 5, 2, 4, 5, 10, 2, 5, 1, 2, 4, 5, 8, 6, 4];

         //方法1：
         let newArr = [];
         arr.forEach(item => {
             if (newArr.indexOf(item) === -1) {
                 newArr.push(item)
             };
         });
         console.log(newArr);

         //方法2：
         let newArr = [];
         arr.forEach((item, index) => {
             if (arr.indexOf(arr[index]) === index) {
                 newArr.push(arr[index]);
             };
         });
         console.log(newArr);

        // 方法3：
         arr.sort();
         let newArr = [arr[0]];
         for (var i = 1; i < arr.length; i++) {
             if (arr[i] !== newArr[newArr.length - 1]) {
                 newArr.push(arr[i]);
             };
         };
         console.log(newArr);

         //方法4：
         let newArr = new Set(arr);
         console.log([...newArr]);
    -->

    <script>
        function fun(somthing) {
            console.log(this.name, somthing);
        }

        function bindFun(fn, obj) {
            return function() {
                return fn.apply(obj, arguments);
            }
        }
        var obj = {
            name: "Jack"
        };
        var bar = bindFun(fun, obj);
        var b = bar("HanMeiMei");
        console.log(b);
    </script>

</body>


</html>